
import java.util.ArrayList;
import java.util.List;

/**
 * DAO父接口
 */
public interface DAO<PO extends AbstractPO> {

    /**
     * 根据id查询记录
     */
    PO findById(Object id);

    /**
     * 查询分页结果
     */
    default <VO extends AbstractVO, QO extends PageQO> PageVO<VO> findByPage(QO qo) {
        int count = this.findCountByQuery(qo);
        List<VO> list;
        if (count > 0) {
            list = this.findListByQuery(qo);
        } else {
            list = new ArrayList<>();
        }
        PageVO<VO> pageVO = new PageVO<>(list, qo.getPageNo(), qo.getPageSize(), count);
        return pageVO;
    }

    /**
     * 根据条件查询记录数
     */
    <QO extends PageQO> int findCountByQuery(QO qo);

    /**
     * 根据分页条件查询列表
     */
    <VO extends AbstractVO, QO extends AbstractQO> List<VO> findListByQuery(QO qo);

    /**
     * 执行插入记录
     */
    int _save(PO po);

    /**
     * 先填充附加字段，再插入记录
     */
    default int save(PO po) {
        LoginContext loginContext = SpringUtil.getBean(LoginContext.class);
        po.preInsert(loginContext.getCurrentUser());
        return this._save(po);
    }

    /**
     * 执行修改实体操作
     */
    int _update(PO po);

    /**
     * 修改实体操作
     */
    default int update(PO po) {
        LoginContext loginContext = SpringUtil.getBean(LoginContext.class);
        po.preUpdate(loginContext.getCurrentUser());
        int count = this._update(po);
        if (count > 0) {
            po.postUpdate();
        }
        return count;
    }

    /**
     * 删除实体
     */
    int delete(Object id);

    /**
     * 根据id判断记录是否存在
     */
    boolean exist(Object id);

}

